<?php
defined('THINK_PATH') or exit();
// +----------------------------------------------------------------------------
// | PHP@妖孽 [三十年河东三十年河西,莫欺少年穷.!]
// +----------------------------------------------------------------------------
// | Copyright (c) 2014 http://www.itdaodan.com All rights reserved.
// +----------------------------------------------------------------------------
// | Author: PHP@妖孽 <dino_ma@163.com>
// +----------------------------------------------------------------------------
/**
 +------------------------------------------------------------------------------
 * PHP开发基础框架函数库
 +------------------------------------------------------------------------------
 * @version   1.0
 * @since 2014-8-8
 +------------------------------------------------------------------------------
 */

/**
 * 对查询结果集进行排序
 * @access public
 * @param array $list 查询结果
 * @param string $field 排序的字段名
 * @param array $sortby 排序类型
 * asc正向排序 desc逆向排序 nat自然排序
 * @return array
 */
function list_sort_by($list,$field, $sortby='asc') {
	if(is_array($list)){
		$refer = $resultSet = array();
		foreach ($list as $i => $data)
			$refer[$i] = &$data[$field];
		switch ($sortby) {
			case 'asc': // 正向排序
				asort($refer);
				break;
			case 'desc':// 逆向排序
				arsort($refer);
				break;
			case 'nat': // 自然排序
				natcasesort($refer);
				break;
		}
		foreach ( $refer as $key=> $val)
			$resultSet[] = &$list[$key];
		return $resultSet;
	}
	return false;
}

/**
 * 获取数组键值
 */
function getArraykey($arr=array(),$key){
	$newarr=array_keys($arr);
	return $newarr[$key];
}


/**
 * 字符串转换为数组，主要用于把分隔符调整到第二个参数
 * @param  string $str  要分割的字符串
 * @param  string $glue 分割符
 * @return array
 * @author PHP@妖孽  <dino_ma@163.com>
 */
function str2arr($str, $glue = ','){
    return explode($glue, $str);
}

/**
 * 数组转换为字符串，主要用于把分隔符调整到第二个参数
 * @param  array  $arr  要连接的数组
 * @param  string $glue 分割符
 * @return string
 * @author PHP@妖孽  <dino_ma@163.com>
 */
function arr2str($arr, $glue = ','){
    return implode($glue, $arr);
}

/**
 * 字符串截取，支持中文和其他编码
 * @static
 * @access public
 * @param string $str 需要转换的字符串
 * @param string $start 开始位置
 * @param string $length 截取长度
 * @param string $charset 编码格式
 * @param string $suffix 截断显示字符
 * @return string
 */
function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true) {
    if(strlen($str) <= $length){
        return $str;
    }
	if(function_exists("mb_substr"))
		$slice = mb_substr($str, $start, $length, $charset);
	elseif(function_exists('iconv_substr')) {
		$slice = iconv_substr($str,$start,$length,$charset);
		if(false === $slice) {
			$slice = '';
		}
	}else{
		$re['utf-8']   = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
		$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
		$re['gbk']    = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
		$re['big5']   = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
		preg_match_all($re[$charset], $str, $match);
		$slice = join("",array_slice($match[0], $start, $length));
	}
	return $suffix ? $slice.'...' : $slice;
}

/**
 * 把返回的数据集转换成Tree
 * @param array $list 要转换的数据集
 * @param string $pid parent标记字段
 * @param string $level level标记字段
 * @return array
 * @author PHP@妖孽 <dino_ma@163.com>
 */
function list_to_tree($list, $pk='id', $pid = 'pid', $child = '_child', $root = 0) {
	// 创建Tree
	$tree = array();
// 	$index = 1;
	if(is_array($list)) {
		if(empty($list)){
			return array();
		}
		// 创建基于主键的数组引用
		$refer = array();
		foreach ($list as $key => $data) {
			$refer[$data[$pk]] =& $list[$key];
		}
		$index = 0;
		foreach ($list as $key => $data) {
			($data[$pid] == 0)? $index = 1 : ++$index ;
			// 判断是否存在parent
			$parentId =  $data[$pid];
			if ($root == $parentId) {
				$tree[] =& $list[$key];
				$list[$key]['level'] = $index;
			}else{
				if (isset($refer[$parentId])) {
					$parent =& $refer[$parentId];
					$parent[$child][] =& $list[$key];
					$list[$key]['level'] = $index;
				}
			}
		}
	}
	return $tree;
}

/**
 * 将list_to_tree的树还原成列表
 * @param  array $tree  原来的树
 * @param  string $child 孩子节点的键
 * @param  string $order 排序显示的键，一般是主键 升序排列
 * @param  array  $list  过渡用的中间数组，
 * @return array        返回排过序的列表数组
 * @author PHP@妖孽 <dino_ma@163.com>
 */
function tree_to_list($tree, $child = '_child', $order='id', &$list = array()){
	if(is_array($tree)) {
		$refer = array();
		foreach ($tree as $key => $value) {
			$reffer = $value;
			if(isset($reffer[$child])){
				unset($reffer[$child]);
				tree_to_list($value[$child], $child, $order, $list);
			}
			$list[] = $reffer;
		}
		$list = list_sort_by($list, $order, $sortby='asc');
	}
	return $list;
}

/**
 * 格式化字节大小
 * @param  number $size      字节数
 * @param  string $delimiter 数字和单位分隔符
 * @return string            格式化后的带单位的大小
 * @author PHP@妖孽 <dino_ma@163.com>
 */
function format_bytes($size, $delimiter = '') {
	$units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
	for ($i = 0; $size >= 1024 && $i < 5; $i++) $size /= 1024;
	return round($size, 2) . $delimiter . $units[$i];
}

/**
 * 时间戳格式化
 * @param int $time
 * @return string 完整的时间显示
 * @author PHP@妖孽 <dino_ma@163.com>
 */
function time_format($time = NULL,$format='Y-m-d H:i:s'){
// 	$time = ($time === NULL) ? NOW_TIME : intval($time);
// 	dump($time);
	if ($time==0 || is_null($time)) {
		return '-';
	}
	return date($format, $time);
}

/**
 * 基于数组创建目录和文件
 */
function create_dir_or_files($files){
	foreach ($files as $key => $value) {
		if(substr($value, -1) == '/'){
			mkdir($value);
		}else{
			@file_put_contents($value, '');
		}
	}
}

/**
 * array_column 优化操作(自动验证)
 */
if(!function_exists('array_column')){
	function array_column(array $input, $columnKey, $indexKey = null) {
		$result = array();
		if (null === $indexKey) {
			if (null === $columnKey) {
				$result = array_values($input);
			} else {
				foreach ($input as $row) {
					$result[] = $row[$columnKey];
				}
			}
		} else {
			if (null === $columnKey) {
				foreach ($input as $row) {
					$result[$row[$indexKey]] = $row;
				}
			} else {
				foreach ($input as $row) {
					$result[$row[$indexKey]] = $row[$columnKey];
				}
			}
		}
		return $result;
	}
}

/**
 * @todo 二维数组去重
 * @param array $array
 * @return array
 * @author PHP@妖孽 <dino_ma@163.com>
 */
function arrayUnique($array){
	foreach ($array as $k => $v) {
		foreach ($array as $k2 => $v2) {
			if (($v2 == $v) && ($k != $k2)) {
				unset($array[$k]);
			}
		}
	}
	return array_merge($array);
}

/**
 * @todo 二维数组处理成字符串
 * @param array $array
 * @return array
 * @author PHP@妖孽 <dino_ma@163.com>
 */
function array_implode($arrays, &$target = array()) {
	foreach ($arrays as $item) {
		if (is_array($item)) {
			array_implode($item, $target);
		} else {
			$target[] = $item;
		}
	}
	return $target;
}

/**
 * @todo 删除目录
 * @param string $dirname
 * @return boolean
 * @author PHP@妖孽 <dino_ma@163.com>
 */
function rmDirr($dirname) {
	if (!file_exists($dirname)) {
		return false;
	}
	if (is_file($dirname) || is_link($dirname)) {
		return unlink($dirname);
	}
	$dir = dir($dirname);
	if($dir){
		while ( false !== $entry = $dir->read()) {
			if ($entry == '.' || $entry == '..') {
				continue;
			}
			rmDirr($dirname . DIRECTORY_SEPARATOR . $entry);
		}
	}
	$dir->close();
	return rmdir($dirname);
}

/**
 * 获取对应状态的文字信息
 * @param int $status
 * @return string 状态文字 ，false 未获取到
 * @author PHP@妖孽 <dino_ma@163.com>
 */
function get_status_title($status = null){
	if(!isset($status)){
		return false;
	}
	switch ($status){
		case -1 : return    '已删除';   break;
		case 0  : return    '禁用';     break;
		case 1  : return    '正常';     break;
		case 2  : return    '待审核';   break;
		default : return    false;      break;
	}
}

/**
 * 产生随机字串，可用来自动生成密码 默认长度6位 字母和数字混合
 * @param string $len 长度
 * @param string $type 字串类型
 * 0 字母 1 数字 其它 混合
 * @param string $addChars 额外字符
 * @return string
 */
function rand_string($len=6,$type='',$addChars='') {
	$str ='';
	switch($type) {
		case 0:
			$chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.$addChars;
			break;
		case 1:
			$chars= str_repeat('0123456789',3);
			break;
		case 2:
			$chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ'.$addChars;
			break;
		case 3:
			$chars='abcdefghijklmnopqrstuvwxyz'.$addChars;
			break;
		case 4:
			$chars = "们以我到他会作时要动国产的一是工就年阶义发成部民可出能方进在了不和有大这主中人上为来分生对于学下级地个用同行面说种过命度革而多子后自社加小机也经力线本电高量长党得实家定深法表着水理化争现所二起政三好十战无农使性前等反体合斗路图把结第里正新开论之物从当两些还天资事队批点育重其思与间内去因件日利相由压员气业代全组数果期导平各基或月毛然如应形想制心样干都向变关问比展那它最及外没看治提五解系林者米群头意只明四道马认次文通但条较克又公孔领军流入接席位情运器并飞原油放立题质指建区验活众很教决特此常石强极土少已根共直团统式转别造切九你取西持总料连任志观调七么山程百报更见必真保热委手改管处己将修支识病象几先老光专什六型具示复安带每东增则完风回南广劳轮科北打积车计给节做务被整联步类集号列温装即毫知轴研单色坚据速防史拉世设达尔场织历花受求传口断况采精金界品判参层止边清至万确究书术状厂须离再目海交权且儿青才证低越际八试规斯近注办布门铁需走议县兵固除般引齿千胜细影济白格效置推空配刀叶率述今选养德话查差半敌始片施响收华觉备名红续均药标记难存测士身紧液派准斤角降维板许破述技消底床田势端感往神便贺村构照容非搞亚磨族火段算适讲按值美态黄易彪服早班麦削信排台声该击素张密害侯草何树肥继右属市严径螺检左页抗苏显苦英快称坏移约巴材省黑武培著河帝仅针怎植京助升王眼她抓含苗副杂普谈围食射源例致酸旧却充足短划剂宣环落首尺波承粉践府鱼随考刻靠够满夫失包住促枝局菌杆周护岩师举曲春元超负砂封换太模贫减阳扬江析亩木言球朝医校古呢稻宋听唯输滑站另卫字鼓刚写刘微略范供阿块某功套友限项余倒卷创律雨让骨远帮初皮播优占死毒圈伟季训控激找叫云互跟裂粮粒母练塞钢顶策双留误础吸阻故寸盾晚丝女散焊功株亲院冷彻弹错散商视艺灭版烈零室轻血倍缺厘泵察绝富城冲喷壤简否柱李望盘磁雄似困巩益洲脱投送奴侧润盖挥距触星松送获兴独官混纪依未突架宽冬章湿偏纹吃执阀矿寨责熟稳夺硬价努翻奇甲预职评读背协损棉侵灰虽矛厚罗泥辟告卵箱掌氧恩爱停曾溶营终纲孟钱待尽俄缩沙退陈讨奋械载胞幼哪剥迫旋征槽倒握担仍呀鲜吧卡粗介钻逐弱脚怕盐末阴丰雾冠丙街莱贝辐肠付吉渗瑞惊顿挤秒悬姆烂森糖圣凹陶词迟蚕亿矩康遵牧遭幅园腔订香肉弟屋敏恢忘编印蜂急拿扩伤飞露核缘游振操央伍域甚迅辉异序免纸夜乡久隶缸夹念兰映沟乙吗儒杀汽磷艰晶插埃燃欢铁补咱芽永瓦倾阵碳演威附牙芽永瓦斜灌欧献顺猪洋腐请透司危括脉宜笑若尾束壮暴企菜穗楚汉愈绿拖牛份染既秋遍锻玉夏疗尖殖井费州访吹荣铜沿替滚客召旱悟刺脑措贯藏敢令隙炉壳硫煤迎铸粘探临薄旬善福纵择礼愿伏残雷延烟句纯渐耕跑泽慢栽鲁赤繁境潮横掉锥希池败船假亮谓托伙哲怀割摆贡呈劲财仪沉炼麻罪祖息车穿货销齐鼠抽画饲龙库守筑房歌寒喜哥洗蚀废纳腹乎录镜妇恶脂庄擦险赞钟摇典柄辩竹谷卖乱虚桥奥伯赶垂途额壁网截野遗静谋弄挂课镇妄盛耐援扎虑键归符庆聚绕摩忙舞遇索顾胶羊湖钉仁音迹碎伸灯避泛亡答勇频皇柳哈揭甘诺概宪浓岛袭谁洪谢炮浇斑讯懂灵蛋闭孩释乳巨徒私银伊景坦累匀霉杜乐勒隔弯绩招绍胡呼痛峰零柴簧午跳居尚丁秦稍追梁折耗碱殊岗挖氏刃剧堆赫荷胸衡勤膜篇登驻案刊秧缓凸役剪川雪链渔啦脸户洛孢勃盟买杨宗焦赛旗滤硅炭股坐蒸凝竟陷枪黎救冒暗洞犯筒您宋弧爆谬涂味津臂障褐陆啊健尊豆拔莫抵桑坡缝警挑污冰柬嘴啥饭塑寄赵喊垫丹渡耳刨虎笔稀昆浪萨茶滴浅拥穴覆伦娘吨浸袖珠雌妈紫戏塔锤震岁貌洁剖牢锋疑霸闪埔猛诉刷狠忽灾闹乔唐漏闻沈熔氯荒茎男凡抢像浆旁玻亦忠唱蒙予纷捕锁尤乘乌智淡允叛畜俘摸锈扫毕璃宝芯爷鉴秘净蒋钙肩腾枯抛轨堂拌爸循诱祝励肯酒绳穷塘燥泡袋朗喂铝软渠颗惯贸粪综墙趋彼届墨碍启逆卸航衣孙龄岭骗休借".$addChars;
			break;
		default :
			// 默认去掉了容易混淆的字符oOLl和数字01，要添加请使用addChars参数
			$chars='ABCDEFGHIJKMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789'.$addChars;
			break;
	}
	if($len>10 ) {//位数过长重复字符串一定次数
		$chars= $type==1? str_repeat($chars,$len) : str_repeat($chars,5);
	}
	if($type!=4) {
		$chars   =   str_shuffle($chars);
		$str     =   substr($chars,0,$len);
	}else{
		// 中文随机字
		for($i=0;$i<$len;$i++){
			$str.= msubstr($chars, floor(mt_rand(0,mb_strlen($chars,'utf-8')-1)),1);
		}
	}
	return $str;
}

/**
 * 获取登录验证码 默认为4位数字
 * @param string $fmode 文件名
 * @return string
 */
function build_verify ($length=4,$mode=1) {
	return rand_string($length,$mode);
}

/**
 * 字节格式化 把字节数格式为 B K M G T 描述的大小
 * @return string
 */
function byte_format($size, $dec=2) {
	$a = array("B", "KB", "MB", "GB", "TB", "PB");
	$pos = 0;
	while ($size >= 1024) {
		$size /= 1024;
		$pos++;
	}
	return round($size,$dec)." ".$a[$pos];
}

/**
 * 检查字符串是否是UTF8编码
 * @param string $string 字符串
 * @return Boolean
 */
function is_utf8($string) {
	return preg_match('%^(?:
         [\x09\x0A\x0D\x20-\x7E]            # ASCII
       | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
       |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
       | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
       |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
       |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
       | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
       |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
    )*$%xs', $string);
}

/**
 * 代码加亮
 * @param String  $str 要高亮显示的字符串 或者 文件名
 * @param Boolean $show 是否输出
 * @return String
 */
function highlight_code($str,$show=false) {
	if(file_exists($str)) {
		$str    =   file_get_contents($str);
	}
	$str  =  stripslashes(trim($str));
	$str = str_replace(array('&lt;', '&gt;'), array('<', '>'), $str);
	$str = str_replace(array('&lt;?php', '?&gt;',  '\\'), array('phptagopen', 'phptagclose', 'backslashtmp'), $str);
	$str = '<?php //tempstart'."\n".$str.'//tempend ?>'; // <?
	$str = highlight_string($str, TRUE);
	if (abs(phpversion()) < 5) {
		$str = str_replace(array('<font ', '</font>'), array('<span ', '</span>'), $str);
		$str = preg_replace('#color="(.*?)"#', 'style="color: \\1"', $str);
	}
	$str = preg_replace("#\<code\>.+?//tempstart\<br />\</span\>#is", "<code>\n", $str);
	$str = preg_replace("#\<code\>.+?//tempstart\<br />#is", "<code>\n", $str);
	$str = preg_replace("#//tempend.+#is", "</span>\n</code>", $str);
	$str = str_replace(array('phptagopen', 'phptagclose', 'backslashtmp'), array('&lt;?php', '?&gt;', '\\'), $str); //<?
	$line   =   explode("<br />", rtrim(ltrim($str,'<code>'),'</code>'));
	$result =   '<div class="code"><ol>';
	foreach($line as $key=>$val) {
		$result .=  '<li>'.$val.'</li>';
	}
	$result .=  '</ol></div>';
	$result = str_replace("\n", "", $result);
	if( $show!== false) {
		echo($result);
	}else {
		return $result;
	}
}

//输出安全的html
function h($text, $tags = null) {
	$text	=	trim($text);
	//完全过滤注释
	$text	=	preg_replace('/<!--?.*-->/','',$text);
	//完全过滤动态代码
	$text	=	preg_replace('/<\?|\?'.'>/','',$text);
	//完全过滤js
	$text	=	preg_replace('/<script?.*\/script>/','',$text);

	$text	=	str_replace('[','&#091;',$text);
	$text	=	str_replace(']','&#093;',$text);
	$text	=	str_replace('|','&#124;',$text);
	//过滤换行符
	$text	=	preg_replace('/\r?\n/','',$text);
	//br
	$text	=	preg_replace('/<br(\s\/)?'.'>/i','[br]',$text);
	$text	=	preg_replace('/<p(\s\/)?'.'>/i','[br]',$text);
	$text	=	preg_replace('/(\[br\]\s*){10,}/i','[br]',$text);
	//过滤危险的属性，如：过滤on事件lang js
	while(preg_match('/(<[^><]+)( lang|on|action|background|codebase|dynsrc|lowsrc)[^><]+/i',$text,$mat)){
		$text=str_replace($mat[0],$mat[1],$text);
	}
	while(preg_match('/(<[^><]+)(window\.|javascript:|js:|about:|file:|document\.|vbs:|cookie)([^><]*)/i',$text,$mat)){
		$text=str_replace($mat[0],$mat[1].$mat[3],$text);
	}
	if(empty($tags)) {
		$tags = 'table|td|th|tr|i|b|u|strong|img|p|br|div|strong|em|ul|ol|li|dl|dd|dt|a';
	}
	//允许的HTML标签
	$text	=	preg_replace('/<('.$tags.')( [^><\[\]]*)>/i','[\1\2]',$text);
	$text = preg_replace('/<\/('.$tags.')>/Ui','[/\1]',$text);
	//过滤多余html
	$text	=	preg_replace('/<\/?(html|head|meta|link|base|basefont|body|bgsound|title|style|script|form|iframe|frame|frameset|applet|id|ilayer|layer|name|script|style|xml)[^><]*>/i','',$text);
	//过滤合法的html标签
	while(preg_match('/<([a-z]+)[^><\[\]]*>[^><]*<\/\1>/i',$text,$mat)){
		$text=str_replace($mat[0],str_replace('>',']',str_replace('<','[',$mat[0])),$text);
	}
	//转换引号
	while(preg_match('/(\[[^\[\]]*=\s*)(\"|\')([^\2=\[\]]+)\2([^\[\]]*\])/i',$text,$mat)){
		$text=str_replace($mat[0],$mat[1].'|'.$mat[3].'|'.$mat[4],$text);
	}
	//过滤错误的单个引号
	while(preg_match('/\[[^\[\]]*(\"|\')[^\[\]]*\]/i',$text,$mat)){
		$text=str_replace($mat[0],str_replace($mat[1],'',$mat[0]),$text);
	}
	//转换其它所有不合法的 < >
	$text	=	str_replace('<','&lt;',$text);
	$text	=	str_replace('>','&gt;',$text);
	$text	=	str_replace('"','&quot;',$text);
	//反转换
	$text	=	str_replace('[','<',$text);
	$text	=	str_replace(']','>',$text);
	$text	=	str_replace('|','"',$text);
	//过滤多余空格
	$text	=	str_replace('  ',' ',$text);
	return $text;
}

function ubb($Text) {
	$Text=trim($Text);
	//$Text=htmlspecialchars($Text);
	$Text=preg_replace("/\\t/is","  ",$Text);
	$Text=preg_replace("/\[h1\](.+?)\[\/h1\]/is","<h1>\\1</h1>",$Text);
	$Text=preg_replace("/\[h2\](.+?)\[\/h2\]/is","<h2>\\1</h2>",$Text);
	$Text=preg_replace("/\[h3\](.+?)\[\/h3\]/is","<h3>\\1</h3>",$Text);
	$Text=preg_replace("/\[h4\](.+?)\[\/h4\]/is","<h4>\\1</h4>",$Text);
	$Text=preg_replace("/\[h5\](.+?)\[\/h5\]/is","<h5>\\1</h5>",$Text);
	$Text=preg_replace("/\[h6\](.+?)\[\/h6\]/is","<h6>\\1</h6>",$Text);
	$Text=preg_replace("/\[separator\]/is","",$Text);
	$Text=preg_replace("/\[center\](.+?)\[\/center\]/is","<center>\\1</center>",$Text);
	$Text=preg_replace("/\[url=http:\/\/([^\[]*)\](.+?)\[\/url\]/is","<a href=\"http://\\1\" target=_blank>\\2</a>",$Text);
	$Text=preg_replace("/\[url=([^\[]*)\](.+?)\[\/url\]/is","<a href=\"http://\\1\" target=_blank>\\2</a>",$Text);
	$Text=preg_replace("/\[url\]http:\/\/([^\[]*)\[\/url\]/is","<a href=\"http://\\1\" target=_blank>\\1</a>",$Text);
	$Text=preg_replace("/\[url\]([^\[]*)\[\/url\]/is","<a href=\"\\1\" target=_blank>\\1</a>",$Text);
	$Text=preg_replace("/\[img\](.+?)\[\/img\]/is","<img src=\\1>",$Text);
	$Text=preg_replace("/\[color=(.+?)\](.+?)\[\/color\]/is","<font color=\\1>\\2</font>",$Text);
	$Text=preg_replace("/\[size=(.+?)\](.+?)\[\/size\]/is","<font size=\\1>\\2</font>",$Text);
	$Text=preg_replace("/\[sup\](.+?)\[\/sup\]/is","<sup>\\1</sup>",$Text);
	$Text=preg_replace("/\[sub\](.+?)\[\/sub\]/is","<sub>\\1</sub>",$Text);
	$Text=preg_replace("/\[pre\](.+?)\[\/pre\]/is","<pre>\\1</pre>",$Text);
	$Text=preg_replace("/\[email\](.+?)\[\/email\]/is","<a href='mailto:\\1'>\\1</a>",$Text);
	$Text=preg_replace("/\[colorTxt\](.+?)\[\/colorTxt\]/eis","color_txt('\\1')",$Text);
	$Text=preg_replace("/\[emot\](.+?)\[\/emot\]/eis","emot('\\1')",$Text);
	$Text=preg_replace("/\[i\](.+?)\[\/i\]/is","<i>\\1</i>",$Text);
	$Text=preg_replace("/\[u\](.+?)\[\/u\]/is","<u>\\1</u>",$Text);
	$Text=preg_replace("/\[b\](.+?)\[\/b\]/is","<b>\\1</b>",$Text);
	$Text=preg_replace("/\[quote\](.+?)\[\/quote\]/is"," <div class='quote'><h5>引用:</h5><blockquote>\\1</blockquote></div>", $Text);
	$Text=preg_replace("/\[code\](.+?)\[\/code\]/eis","highlight_code('\\1')", $Text);
	$Text=preg_replace("/\[php\](.+?)\[\/php\]/eis","highlight_code('\\1')", $Text);
	$Text=preg_replace("/\[sig\](.+?)\[\/sig\]/is","<div class='sign'>\\1</div>", $Text);
	$Text=preg_replace("/\\n/is","<br/>",$Text);
	return $Text;
}

// 随机生成一组字符串
function build_count_rand ($number,$length=4,$mode=1) {
	if($mode==1 && $length<strlen($number) ) {
		//不足以生成一定数量的不重复数字
		return false;
	}
	$rand   =  array();
	for($i=0; $i<$number; $i++) {
		$rand[] =   rand_string($length,$mode);
	}
	$unqiue = array_unique($rand);
	if(count($unqiue)==count($rand)) {
		return $rand;
	}
	$count   = count($rand)-count($unqiue);
	for($i=0; $i<$count*3; $i++) {
		$rand[] =   rand_string($length,$mode);
	}
	$rand = array_slice(array_unique ($rand),0,$number);
	return $rand;
}

function remove_xss($val) {
	$val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val);
	$search = 'abcdefghijklmnopqrstuvwxyz';
	$search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
	$search .= '1234567890!@#$%^&*()';
	$search .= '~`";:?+/={}[]-_|\'\\';
	for ($i = 0; $i < strlen($search); $i++) {
		$val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); // with a ;
		$val = preg_replace('/(&#0{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // with a ;
	}
	$ra1 = array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');
	$ra2 = array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');
	$ra = array_merge($ra1, $ra2);
	$found = true; // keep replacing as long as the previous round replaced something
	while ($found == true) {
		$val_before = $val;
		for ($i = 0; $i < sizeof($ra); $i++) {
			$pattern = '/';
			for ($j = 0; $j < strlen($ra[$i]); $j++) {
				if ($j > 0) {
					$pattern .= '(';
					$pattern .= '(&#[xX]0{0,8}([9ab]);)';
					$pattern .= '|';
					$pattern .= '|(&#0{0,8}([9|10|13]);)';
					$pattern .= ')*';
				}
				$pattern .= $ra[$i][$j];
			}
			$pattern .= '/i';
			$replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2); // add in <> to nerf the tag
			$val = preg_replace($pattern, $replacement, $val); // filter out the hex tags
			if ($val_before == $val) {
				$found = false;
			}
		}
	}
	return $val;
}

/**
 * 在数据列表中搜索
 * @access public
 * @param array $list 数据列表
 * @param mixed $condition 查询条件
 * 支持 array('name'=>$value) 或者 name=$value
 * @return array
 * @author PHP@妖孽 <dino_ma@163.com>
 */
function list_search($list,$condition) {
	if(is_string($condition))
		parse_str($condition,$condition);
	// 返回的结果集合
	$resultSet = array();
	foreach ($list as $key=>$data){
		$find   =   false;
		foreach ($condition as $field=>$value){
			if(isset($data[$field])) {
				if(0 === strpos($value,'/')) {
					$find   =   preg_match($value,$data[$field]);
				}elseif($data[$field]==$value){
					$find = true;
				}
			}
		}
		if($find)
			$resultSet[]     =   &$list[$key];
	}
	return $resultSet;
}

// 自动转换字符集 支持数组转换
function auto_charset($fContents, $from='gbk', $to='utf-8') {
	$from = strtoupper($from) == 'UTF8' ? 'utf-8' : $from;
	$to = strtoupper($to) == 'UTF8' ? 'utf-8' : $to;
	if (strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents))) {
		//如果编码相同或者非字符串标量则不转换
		return $fContents;
	}
	if (is_string($fContents)) {
		if (function_exists('mb_convert_encoding')) {
			return mb_convert_encoding($fContents, $to, $from);
		} elseif (function_exists('iconv')) {
			return iconv($from, $to, $fContents);
		} else {
			return $fContents;
		}
	} elseif (is_array($fContents)) {
		foreach ($fContents as $key => $val) {
			$_key = auto_charset($key, $from, $to);
			$fContents[$_key] = auto_charset($val, $from, $to);
			if ($key != $_key)
				unset($fContents[$key]);
		}
		return $fContents;
	}
	else {
		return $fContents;
	}
}

/**
 * select返回的数组进行整数映射转换
 *
 * @param array $map  映射关系二维数组  array(
 *                                          '字段名1'=>array(映射关系数组),
 *                                          '字段名2'=>array(映射关系数组),
 *                                           ......
 *                                       )
 * @author PHP@妖孽<dino_ma@163.com>
 * @return array
 *
 *  array(
 *      array('id'=>1,'title'=>'标题','status'=>'1','status_text'=>'正常')
 *      ....
 *  )
 *
 */
function int_to_string(&$data,$map=array('status'=>array(-1=>'删除',1=>'正常',0=>'禁用',2=>'未审核',3=>'草稿'))) {
	if($data === false || $data === null ){
		return $data;
	}
	$data = (array)$data;
	foreach ($data as $key => $row){
		foreach ($map as $col=>$pair){
			if(isset($row[$col]) && isset($pair[$row[$col]])){
				$data[$key][$col.'_text'] = $pair[$row[$col]];
			}
		}
	}
	return $data;
}

/**
 * 数据签名认证
 * @param  array  $data 被认证的数据
 * @return string       签名
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function data_auth_sign($data) {
	//数据类型检测
	if(!is_array($data)){
		$data = (array)$data;
	}
	ksort($data); //排序
	$code = http_build_query($data); //url编码并生成query字符串
	$sign = sha1($code); //生成签名
	return $sign;
}

/**
 * 调用系统的API接口方法（静态方法）
 * api('User/getName','id=5'); 调用公共模块的User接口的getName方法
 * api('Admin/User/getName','id=5');  调用Admin模块的User接口
 * @param  string  $name 格式 [模块名]/接口名/方法名
 * @param  array|string  $vars 参数
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function api($name,$vars=array()){
	$array     = explode('/',$name);
	$method    = array_pop($array);
	$classname = array_pop($array);
	$module    = $array? array_pop($array) : 'Common';
	$callback  = $module.'\\Api\\'.$classname.'Api::'.$method;
	if(is_string($vars)) {
		parse_str($vars,$vars);
	}
	return call_user_func_array($callback,$vars);
}

/**
 * 检测验证码
 * @param  integer $id 验证码ID
 * @return boolean     检测结果
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function check_verify($code, $id = 1){
	$verify = new \Think\Verify();
	return $verify->check($code, $id);
}

/**
 * 系统非常规MD5加密方法
 * @param  string $str 要加密的字符串
 * @return string
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function tke_md5($str, $key = 'TkeAdmin'){
	return '' === $str ? '' : md5(sha1($str) . $key);
}

/**
 * 系统加密方法
 * @param string $data 要加密的字符串
 * @param string $key  加密密钥
 * @param int $expire  过期时间 (单位:秒)
 * @return string
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function tke_encrypt($data, $key, $expire = 0) {
	$key  = md5($key);
	$data = base64_encode($data);
	$x    = 0;
	$len  = strlen($data);
	$l    = strlen($key);
	$char =  '';
	for ($i = 0; $i < $len; $i++) {
		if ($x == $l) $x=0;
		$char  .= substr($key, $x, 1);
		$x++;
	}
	$str = sprintf('%010d', $expire ? $expire + time() : 0);
	for ($i = 0; $i < $len; $i++) {
		$str .= chr(ord(substr($data,$i,1)) + (ord(substr($char,$i,1)))%256);
	}
	return str_replace('=', '', base64_encode($str));
}

/**
 * 系统解密方法
 * @param string $data 要解密的字符串 （必须是think_encrypt方法加密的字符串）
 * @param string $key  加密密钥
 * @return string
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function tke_decrypt($data, $key){
	$key    = md5($key);
	$x      = 0;
	$data   = base64_decode($data);
	$expire = substr($data, 0, 10);
	$data   = substr($data, 10);
	if($expire > 0 && $expire < time()) {
		return '';
	}
	$len  = strlen($data);
	$l    = strlen($key);
	$char = $str = '';
	for ($i = 0; $i < $len; $i++) {
		if ($x == $l) $x = 0;
		$char  .= substr($key, $x, 1);
		$x++;
	}
	for ($i = 0; $i < $len; $i++) {
		if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) {
			$str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
		}else{
			$str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
		}
	}
	return base64_decode($str);
}

/**
 * 获取分类信息并缓存分类
 * @param  integer $id    分类ID
 * @param  string  $field 要获取的字段名
 * @return string         分类信息
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function get_category($id, $field = null){
	static $list;
	/* 非法分类ID */
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	/* 读取缓存数据 */
	if(empty($list)){
		$list = S('sys_category_list');
	}
	/* 获取分类名称 */
	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
		$cate = M('Category')->find($id);
		if(!$cate || 1 != $cate['status']){ //不存在分类，或分类被禁用
			return '';
		}
		$list[$id] = $cate;
		S('sys_category_list', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 根据ID获取分类标识 
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function get_category_name($id){
	return get_category($id, 'name');
}

/**
 * 根据ID获取分类名称
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function get_category_title($id){
	return get_category($id, 'title');
}

/**
 * @todo  过滤危险的html代码
 * @param unknown $val
 */
function safeHtml($val){
	import('Common.Msj.Util.Input');
	return \Input::safeHtml($val);
}

/**
 * @todo 格式化金钱
 * @param float $number
 * @param bollen $fractional
 * @return Ambigous <string, mixed>
 * @authro PHP@妖孽 <dino_ma@163.com>
 */
function formatMoney($number, $fractional=false) {
	if ($fractional) {
		$number = sprintf('%.2f', $number);
	}
	while (true) {
		$replaced = preg_replace('/(-?\d+)(\d\d\d)/', '$1,$2', $number);
		if ($replaced != $number) {
			$number = $replaced;
		} else {
			break;
		}
	}
	return $number;
}

/**
 * 探测一个模型类 格式 [资源://][模块/]模型是否存在
 * @param string $name 资源地址
 * @param string $layer 模型层名称
 * @return Think\Model
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function modelIsExists($name='',$layer='') {
	if(empty($name)) return new Think\Model;
	static $_model  =   array();
	$layer          =   $layer? : C('DEFAULT_M_LAYER');
	if(isset($_model[$name.$layer]))
		return $_model[$name.$layer];
	$class          =   parse_res_name($name,$layer);
	if(class_exists($class)) {
		return true;
	}elseif(false === strpos($name,'/')){
		// 自动加载公共模块下面的模型
		if(!C('APP_USE_NAMESPACE')){
			import('Common/'.$layer.'/'.$class);
		}else{
			$class      =   '\\Common\\'.$layer.'\\'.$name.$layer;
		}
		return true;
	}else {
		return false;
	}
}


/**
 * 获取用户信息信息并缓存分类
 * @param  integer $id    用户ID
 * @param  string  $field 要获取的字段名
 * @return string         分类信息
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getUserInfo($id, $field = null){
	static $list;
	/* 非法分类ID */
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	/* 读取缓存数据 */
	$list = S('sys_user_list');
	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
		$info = M('Member')->field($field)->where(array('uid'=>$id))->find();
		if(!$info){ //不存在用户，或用户被禁用
			return '';
		}
		$list[$id] = $info;
		S('sys_user_list', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 根据ID获取员工名称
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getUserName($id){
	return getUserInfo($id, 'member_name');
}

/**
 * 根据ID获取员工手机号
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getMobilePhone($id){
	return getUserInfo($id, 'mobile_phone');
}


/**
 * 获取活动分类信息并缓存分类
 * @param  integer $id    分类ID
 * @param  string  $field 要获取的字段名
 * @return string         分类信息
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getActivityCategoryInfo($id, $field = null){
	static $list;
	/* 非法分类ID */
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	/* 读取缓存数据 */
	$list = S('sys_activity_category_list');
	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
		$info = M('ActivityCategory')->field($field)->where(array('activity_category_id'=>$id))->find();
		if(!$info){ //不存在用户，或用户被禁用
			return '';
		}
		$list[$id] = $info;
		S('sys_activity_category_list', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 根据ID获取活动分类名称
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getActivityCategoryName($id){
	return getActivityCategoryInfo($id, 'category_name');
}


/**
 * 调用的时候截取缩略图
 * @param string (filename) $path 资源路径
 * @param int w 缩略图宽度
 * @param int h 缩略图高度
 * @return string path 缩略图路径 
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getThumb($path,$w,$h){
	if(empty($path) || !file_exists('.'.$path)){
		//返回默认图片
    	return C('LOAD_DEFAULT_PICTURE');
    }
    static $img;
    $arr = str2arr($path, '.');
    if(empty($arr)){
    	//返回默认图片
    	return C('LOAD_DEFAULT_PICTURE');
    }
    $arr[0] .=$w.'_'.$h;
    $new_path = arr2str($arr, '.');
    if(is_file('.'.$new_path)){
    	return  $new_path;
    }else{
    	//生产缩略图
    	import('Common.Msj.ThinkImage.ThinkImage');
    	$img = new \ThinkImage(2);
    	$img->open('.'.$path);
    	$img->thumb((int)$w,(int)$h)->save('.'.$new_path);
    	return $new_path;
    }
}



/**
 * 获取静态图片信息
 * @param  integer $id    图片ID
 * @param  string  $field 要获取的字段名
 * @return string         分类信息
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getPictureInfo($id, $field = 'path'){
    static $list;
    /* 非法分类ID */
    if(empty($id) || !is_numeric($id)){
        return '';
    }
    /* 读取缓存数据 */
    $list = S('sys_picture_info');
//     if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
    if(!isset($list[$id]) || empty($list[$id])){
        $info = M('picture')->field($field)->where(array('id'=>$id))->find();
        if(!$info){ //不存在用户，或用户被禁用
            return '';
        }
        $list[$id] = $info;
        S('sys_picture_info', $list,3600); //更新缓存
    }
    return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * @todo 获取图片缩略图
 * @param integer $id //图片id
 * @param int w 缩略图宽度
 * @param int h 缩略图高度
 * @return string path 缩略图路径 
 * @author PHP@妖孽 <dino_ma@163.com>
 */
function getPictureThumb($id,$w,$h){
    $path = getPictureInfo($id,null);
    if(empty($path)){
        return C('LOAD_DEFAULT_PICTURE');
    }
    if(!empty($path['url'])){
        return $path['url'].'?imageMogr2/thumbnail/'.$w.'x'.$h;
    }
    if(!empty($path['path'])){
        return str_replace('/Public/', PUBLIC_PATH, $path['path']).'?imageMogr2/thumbnail/'.$w.'x'.$h;
    }
    return C('LOAD_DEFAULT_PICTURE');
    
//     return ($id > 0)? getThumb(getPictureInfo($id), $w, $h) : C('LOAD_DEFAULT_PICTURE') ;
}


/**
 * @todo 判断手机端访问
 * @author fang
 */
function isMobile(){
    // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
    if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])){
        return true;
    }
    //此条摘自TPM智能切换模板引擎，适合TPM开发
    if(isset ($_SERVER['HTTP_CLIENT']) &&'PhoneClient'==$_SERVER['HTTP_CLIENT']){
        return true;
    }
    //如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
    if (isset ($_SERVER['HTTP_VIA'])){
        //找不到为flase,否则为true
        return stristr($_SERVER['HTTP_VIA'], 'wap') ? true : false;
    }
    //判断手机发送的客户端标志,兼容性有待提高
    if (isset ($_SERVER['HTTP_USER_AGENT'])) {
        $clientkeywords = array(
            'nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile'
        );
        //从HTTP_USER_AGENT中查找手机浏览器的关键字
        if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
            return true;
        }
    }
    //协议法，因为有可能不准确，放到最后判断
    if (isset ($_SERVER['HTTP_ACCEPT'])) {
        // 如果只支持wml并且不支持html那一定是移动设备
        // 如果支持wml和html但是wml在html之前则是移动设备
        if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
            return true;
        }
    }
    return false;
}

/**
 * 获取对应的支付类型
 * @param int $type
 * @return string 状态文字 ，false 未获取到
 * @author PHP@妖孽 <dino_ma@163.com>
 * 0:未选支付类型;1:pos机支付;2:现金支付;3支付宝;4:财付通;5:支付宝wap端;6:微信PC扫码;7:微信JSSDK支付;8:绑定消费;9:优惠卷
 */
function get_pay_title($type = null){
    if(!isset($type)){
        return false;
    }
    switch ($type){
        case 0  : return    '未选支付类型';    break;
        case 1  : return    'pos机';    break;
        case 2  : return    '现金';   break;
        case 3  : return    '支付宝';    break;
        case 4  : return    '财付通';    break;
        case 5  : return    '支付宝wap端';   break;
        case 6  : return    '微信PC扫码';   break;
        case 7  : return    '微信JSSDK支付';   break;
        case 8  : return    '绑定消费';   break;
        case 9  : return    '优惠券';   break;
        default : return    false;      break;
    }
}

/**
 * 获取对应的支付方式
 * @param int $type
 * @return string 状态文字 ，false 未获取到
 * @author PHP@妖孽 <dino_ma@163.com>
 * 1:线下订单;2:线上订单;
 */
function get_order_type_title($type = null){
    if(!isset($type)){
        return false;
    }
    switch ($type){
        case 1  : return    '线下';    break;
        case 2  : return    '线上';   break;
        default : return    false;      break;
    }
}


/**
 * 获取商品类型标题
 * @param int $type
 * @return string 状态文字 ，false 未获取到
 * @author fang
 * 0:正常 1:促销 2:团购
 */
function get_goods_type_title($type = null){
    if(!isset($type)){
        return false;
    }
    switch ($type){
        case 0  : return    '正常';    break;
        case 1  : return    '促销';   break;
        case 2  : return    '团购';   break;
        default : return    false;      break;
    }
}


/**
 * 获取邮寄状态标题
 * @param int $type
 * @return string 状态文字 ，false 未获取到
 * @author PHP@妖孽 <dino_ma@163.com>
 * 0-未邮寄,1-已邮寄,2-已签收,3-已拒收
 */
function get_mail_title($type = null){
    if(!isset($type)){
        return false;
    }
    switch ($type){
        case 0  : return    '待发送';    break;
        case 1  : return    '已邮寄';    break;
        case 2  : return    '已签收';    break;
        case 3  : return    '已拒收';    break;
        default : return    false;      break;
    }
}

/**
 * 获取对应的支付状态
 * @param int $type
 * @return string 状态文字 ，false 未获取到
 * @author PHP@妖孽 <dino_ma@163.com>
 * 0:订单创建成功待支付;1:支付失败;2:支付成功(已付款);3:已退款;4:已消费5:申请核销;6:已核销;7:已结算;8绑定订单;9申请退款
 */
function get_type_title($type = null){
    if(!isset($type)){
        return false;
    }
    switch ($type){
        case 0  : return    '下单成功';    break;
        case 1  : return    '支付失败';    break;
        case 2  : return    '已付款';   break;
        case 3  : return    '已退款';    break;
        case 4  : return    '已绑定';    break;
        case 5  : return    '申请核销';   break;
        case 6  : return    '已核销';   break;
        case 7  : return    '已结算';   break;
        case 8  : return    '绑定订单';   break;
        case 9  : return    '申请退款';   break;
        case 10 : return    '申请驳回';   break;
        default : return    false;      break;
    }
}


/**
 * 获取对应的支付状态(商户版)
 * @param int $type
 * @return string 状态文字 ，false 未获取到
 * @author PHP@妖孽 <dino_ma@163.com>
 * 0:订单创建成功待支付;1:支付失败;2:支付成功(已付款);3:已退款;4:已消费5:处理中;6://已核销//;7:已返款;8绑定订单;9申请退款
 */
function get_type_title_merchant($type = null){
    if(!isset($type)){
        return false;
    }
    switch ($type){
        case 0  : return    '下单成功';    break;
        case 1  : return    '支付失败';    break;
        case 2  : return    '<font color="green">未申请</font>';   break;
        case 3  : return    '<font color="#ec971f">已退款</font>';    break;
        case 4  : return    '<font color="green">未申请</font>';    break;
        case 5  : return    '<font color="#f60000">处理中</font>';   break;
        case 7  : return    '<font color="#cccccc">已返款</font>';   break;
        case 8  : return    '绑定订单';   break;
        case 9  : return    '申请退款';   break;
        default : return    '';      break;
    }
}

/**
 * 获取对应的流水状态
 * @param int $type
 * @return string 状态文字 ，false 未获取到
 * @author PHP@妖孽 <dino_ma@163.com>
 * 0-无,1-A类客户,2-B类客户,3-C类客户
 */
function getCustomerLevel($type = null){
    if(!isset($type)){
        return false;
    }
    switch ($type){
        case 0  : return    '';    break;
        case 1  : return    'A类客户';   break;
        case 2  : return    'B类客户';   break;
        case 3  : return    'C类客户';   break;
        default : return    false;      break;
    }
}

//

/**
 * 获取对应的流水状态
 * @param int $type
 * @return string 状态文字 ，false 未获取到
 * @author PHP@妖孽 <dino_ma@163.com>
 * 1:收款;2:退款
 */
function get_payment_type_title($type = null){
    if(!isset($type)){
        return false;
    }
    switch ($type){
        case 1  : return    '收款';    break;
        case 2  : return    '退款';   break;
        default : return    false;      break;
    }
}

/**
 * 获取活动信息并缓存
 * @param  integer $id    活动ID
 * @param  string  $field 要获取的字段名
 * @return string         分类信息
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getActivityInfo($id, $field = null){
	static $list;
	/* 非法分类ID */
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	/* 读取缓存数据 */
	$list = S('sys_activity_');
	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
		$info = M('Activity')->field($field)->where(array('activity_id'=>$id))->find();
		if(!$info){ //不存在用户，或用户被禁用
			return '';
		}
		$list[$id] = $info;
		S('sys_activity_', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 根据ID获取活动名称
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getActivityName($id){
    $name = '';
    switch ($id){
        case -1;
        $name = '线上订单';
        break;
        case -2:
        $name = '天天特卖';
        break;
        case -2:
        $name = '团购商品';
        break;
        default:
        $name = getActivityInfo($id, 'activity_name');
        break; 
    }
	return $name;
}



/**
 * 获取商户信息并缓存
 * @param  integer $id    分类ID
 * @param  string  $field 要获取的字段名
 * @return string         分类信息
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getMerchantInfo($id, $field = null){
	static $list;
	/* 非法分类ID */
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	/* 读取缓存数据 */
	$list = S('sys_merchant_');
	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
		$info = M('Merchant')->field($field)->where(array('merchant_id'=>$id))->find();
		if(!$info){ //不存在用户，或用户被禁用
			return '';
		}
		$list[$id] = $info;
		S('sys_merchant_', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 根据ID获取商户名称
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getMerchantName($id){
	return getMerchantInfo($id, 'merchant_name');
}


/**
 * 获取展会分类信息并缓存
 * @param  integer $id    分类ID
 * @param  string  $field 要获取的字段名
 * @return string         分类信息
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getConfCategoryInfo($id, $field = null){
	static $list;
	/* 非法分类ID */
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	/* 读取缓存数据 */
	$list = S('sys_conf_category_');
	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
		$info = M('conf_category')->field($field)->where(array('conf_category_id'=>$id))->find();
		if(!$info){ //不存在用户，或用户被禁用
			return '';
		}
		$list[$id] = $info;
		S('sys_conf_category_', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 获取展会分类信息并缓存
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getConfCategoryName($id){
	return getConfCategoryInfo($id, 'conf_category');
}




/**
 * 获取店铺信息并缓存
 * @param  integer $id    分类ID
 * @param  string  $field 要获取的字段名
 * @return string         分类信息
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getShopInfo($id, $field = null){
	static $list;
	/* 非法分类ID */
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	/* 读取缓存数据 */
	$list = S('sys_shop_');
	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
		$info = M('shop')->field($field)->where(array('shop_id'=>$id))->find();
		if(!$info){ //不存在用户，或用户被禁用
			return '';
		}
		$list[$id] = $info;
		S('sys_shop_', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 获取店铺信息并缓存
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getShopName($id){
	return getShopInfo($id, 'shop_name');
}



/**
 * 获取店铺品类信息
 * @param  integer $id    店铺id
 * @param  string  $field 要获取的字段名
 * @return string         品类信息
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getGoodsCategoryInfo($id, $field = null){
    static $list;
    /* 非法分类ID */
    if(empty($id) || !is_numeric($id)){
        return '';
    }
    /* 读取缓存数据 */
    $list = S('sys_shop_goods_category_');
    if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
        $info = M('shop_goods_category')->field($field)->where(array('goods_category_id'=>$id))->find();
        if(!$info){ //不存在用户，或用户被禁用
            return '';
        }
        $list[$id] = $info;
        S('sys_shop_goods_category_', $list,3600); //更新缓存
    }
    return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 获取店铺品类信息
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getGoodsCategoryName($id){
    return getGoodsCategoryInfo($id, 'goods_category_name');
}


/**
 * 获取客户信息并缓存
 * @param  integer $id    客户ID
 * @param  string  $field 要获取的字段名
 * @return string         分类信息
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getCustomerInfo($id, $field = null){
	static $list;
	/* 非法分类ID */
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	/* 读取缓存数据 */
	$list = S('sys_customer_');
	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
		$info = M('customer')->field($field)->where(array('customer_id'=>$id))->find();
		if(!$info){ //不存在用户，或用户被禁用
			return '';
		}
		$list[$id] = $info;
		S('sys_customer_', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 获取客户名称
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getCustomerName($id){
	return getCustomerInfo($id, 'mobile_phone');
}


/**
 * 获取客户信息并缓存
 * @param  integer $id    分类ID
 * @param  string  $field 要获取的字段名
 * @return string         分类信息
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getCustomerInfoNew($id, $field = null){
    static $list;
    /* 非法分类ID */
    if(empty($id) || !is_numeric($id)){
        return '';
    }
    /* 读取缓存数据 */
    $list = S('sys_customer_new_');
    if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
        $info = M('customer_detail')->field($field)->where(array('customer_id'=>$id))->find();
        if(!$info){ //不存在用户，或用户被禁用
            return '';
        }
        $list[$id] = $info;
        S('sys_customer_new_', $list,3600); //更新缓存
    }
    return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 获取客户名称
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getCustomerNameNew($id){
    return getCustomerInfoNew($id, 'customer_name');
}

/**
 * 检测活动是否存在
 * @return boolean          ture - 未重名，false - 已重名
 * @author sap
 */
function isActivity($activity_id=0){
	$activity_id = (int)$activity_id;
	if($activity_id == 0){
		return false;
	}
	//判断是否存在
	if(getActivityName($activity_id)==''){
		return false;
	}
	return true;
}

/**
 * 检测店铺是否存在
 * @return boolean          ture - 未重名，false - 已重名
 * @author sap
 */
function isShop($shop_id=0){
	$shop_id = (int)$shop_id;
	if($shop_id == 0){
		return false;
	}
	//判断是否存在
	if(!D('Admin/Shop')->shopShow($shop_id,'shop_id')){
		return false;
	}
	return true;
}

/**
 * 检测品类是否存在
 * @return boolean          ture - 未重名，false - 已重名
 * @author sap
 */
function isConfCategory($conf_category_id=0){
	$conf_category_id = (int)$conf_category_id;
	if($conf_category_id == 0){
		return false;
	}
	//判断是否存在
	if(!D('Admin/ConfCategory')->confCategoryShow($conf_category_id,'conf_category_id')){
		return false;
	}
	return true;
}

/**
 * 检测商品品类是否存在
 * @return boolean          ture - 未重名，false - 已重名
 * @author fzh
 */
function isGoodsCategory($goods_category_id=0){
    $goods_category_id = (int)$goods_category_id;
    if($goods_category_id == 0){
        return false;
    }
    //判断是否存在
    if(!D('ServiceApi')->goodsCategoryShow($goods_category_id,'goods_category_id')){
        return false;
    }
    return true;
}

/**
 * 检测商户是否存在
 * @return boolean          ture - 未重名，false - 已重名
 * @author sap
 */
function isMerchant($isMerchant=0){
	$isMerchant = (int)$isMerchant;
	if($isMerchant == 0){
		return false;
	}
	//判断是否存在
	if(!D('Admin/Merchant')->merchantShow($isMerchant,'merchant_id')){
		return false;
	}
	return true;
}

/**
 * @todo    班车数量返回
 * @author  fang
 */
function getBusCount($array, $key){
    return (isset($array[$key]))? $array[$key].'（位）' : '' ;
}

/**
 * @todo    订单补号
 * @return  string 13位纸质订单号
 * @author  fang
 */
function paperOrderPad($str, $lenth = 13){
    return str_pad($str, $lenth, 0,STR_PAD_LEFT);
}

/**
 * @todo 商户密码加密
 * @param string pwd 密码
 * @author PHP@妖孽<dino_ma@163.com>
 */
function encryptMerchantPwd($pwd){
	return md5(md5($pwd,'^&*%^&$%^$%'));
}

/**
 * @todo 生成推广链接
 * @param int  $member_id 员工id
 * @param key $key
 * @author PHP@妖孽<dino_ma@163.com>
 */
function encryptUrl($member_id,$key='~!@&^%#%$@#$'){
	$str = (string)$member_id.$key;
	return str_replace('=', '', base64_encode($str));
}

/**
 * @todo 解密推广链接
 * @param int  $member_id 员工id
 * @param key $key
 * @author PHP@妖孽<dino_ma@163.com>
 */
function decryptUrl($encrypt_str,$key='~!@&^%#%$@#$'){
	return str_replace($key, '', base64_decode($encrypt_str.'='));
}

/**
 * @todo 获取推广id
 * @author PHP@妖孽<dino_ma@163.com>
 */
function getGeneralizeMemberId(){
	if(cookie('sdsfd_extend')){
		$generalize_member_id = (int)decryptUrl(cookie('sdsfd_extend'));
		if($generalize_member_id!=0){
			//暂时不考虑推广id是否存在的问题后期考虑
			$generalize_member_id= (int)$generalize_member_id;
			$member_info = M('Member')->where(array('uid'=>$generalize_member_id))->field('uid')->find();
			if(empty($member_info)){
				$generalize_member_id = 0;
			}
		}else{
			$generalize_member_id =0;
		}
		return (is_null($generalize_member_id))?0:$generalize_member_id;
	}else{
		return 0;
	}
}



/**
 * 获取省份名称
 * @param  integer $id    省份ID
 * @param  string  $field 要获取的字段名
 * @return string         省份名称
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getProvinceName($id, $field = 'province_name'){
	static $list;
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	$list = S('service_province_name');
	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
		$info = M('province')->field($field)->where(array('province_id'=>$id))->find();
		if(!$info){ 
			return '';
		}
		$list[$id] = $info;
		S('service_province_name', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}


/**
 * 获取城市名称
 * @param  integer $id    城市id
 * @param  string  $field 要获取的字段名
 * @return string         城市名称
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getCityName($id, $field = 'city_name'){
	static $list;
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	$list = S('service_city_name');
	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
		$info = M('city')->field($field)->where(array('city_id'=>$id,'status'=>1))->find();
		if(!$info){
			return '';
		}
		$list[$id] = $info;
		S('service_city_name', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}


/**
 * 获取行政区名称
 * @param  integer $id    行政区id
 * @param  string  $field 要获取的字段名
 * @return string         行政区名称
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getWardName($id, $field = 'ward_name'){
	static $list;
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	$list = S('service_ward_name');
	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
		$info = M('ward')->field($field)->where(array('ward_id'=>$id,'status'=>1))->find();
		if(!$info){
			return '';
		}
		$list[$id] = $info;
		S('service_ward_name', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 获取小区名称
 * @param  integer $id    小区id
 * @param  string  $field 要获取的字段名
 * @return string         行政区名称
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getVillageName($id, $field = 'village_name'){
	static $list;
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	$list = S('service_village_name');
	if(empty($list[$id])){
		$info = M('village')->field($field)->where(array('village_id'=>$id,'status'=>1))->find();
		if(!$info){
			return '';
		}
		$list[$id] = $info;
		S('service_village_name', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}


/**
 * 获取班车点信息
 * @param  integer $id    班车点id
 * @param  string  $field 要获取的字段名
 * @return string         班车点信息
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getBusPointInfo($id, $field = null){
	static $list;
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	$list = S('service_bus_info');
	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
		$info = M('ServiceBusPoint')->field($field)->where(array('bus_point_id'=>$id,'status'=>1))->find();
		if(!$info){
			return '';
		}
		$list[$id] = $info;
		S('service_bus_info', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 获取班车点名称
 * @param  integer $id    班车点id
 * @return string         班车点名称
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getBusPointName($id){
	return getBusPointInfo($id,'bus_point_name');
}


/**
 * 获取销售网点
 * @param  integer $id    销售网点id
 * @param  string  $field 要获取的字段名
 * @return string         销售网点信息
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getSalePointInfo($id, $field = null){
	static $list;
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	$list = S('service_sale_point_info');
	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
		$info = M('ServiceSalePoint')->field($field)->where(array('sale_point_id'=>$id,'status'=>1))->find();
		if(!$info){
			return '';
		}
		$list[$id] = $info;
		S('service_sale_point_info', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 获取销售网点名称
 * @param  integer $id    销售网点id
 * @return string         销售网点名称
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getSalePointName($id){
	return getSalePointInfo($id,'sale_point_name');
}



/**
 * 获取销售网点
 * @param  integer $id    短信模版id
 * @param  string  $field 要获取的字段名
 * @return string         短信模版内容
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getSmsTemplateInfo($id, $field = null){
	static $list;
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	$list = S('service_sms_template');
	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
		$info = M('ServiceSmsTemplate')->field($field)->where(array('sms_template_id'=>$id,'status'=>1))->find();
		if(!$info){
			return '';
		}
		$list[$id] = $info;
		S('service_sms_template', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 短信模版名称
 * @param  integer $id    短信模版id
 * @return string         短信模版名称
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getSmsTemplateName($id){
	return getSmsTemplateInfo($id,'sms_template_name');
}


/**
 * 获取客服系统中的客户信息并缓存
 * @param  integer $id    分类ID
 * @param  string  $field 要获取的字段名
 * @return string         分类信息
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getServiceCustomerInfo($id, $field = null){
	static $list;
	/* 非法分类ID */
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	/* 读取缓存数据 */
	$list = S('sys_service_customer_detail_');
	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
		$info = M('service_customer_detail')->field($field)->where(array('customer_id'=>$id))->find();
		if(!$info){ //不存在用户，或用户被禁用
			return '';
		}
		if($field=='customer_name' && isset($info[$field]) && $info[$field] == ''){
			$info['customer_name']= getCustomerNameNew($id);
		}
		$list[$id] = $info;
		S('sys_service_customer_detail_', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 获取客服系统中的客户
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getServiceCustomerName($id){
	return getServiceCustomerInfo($id, 'customer_name');
}



/**
 * 获取系统中的部门信息
 * @param  integer $id    部门id
 * @param  string  $field 部门名称
 * @return string         部门信息
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getDepartmentInfo($id, $field = null){
	static $list;
	/* 非法分类ID */
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	/* 读取缓存数据 */
	$list = S('sys_auth_department');
	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
		$info = M('auth_department')->field($field)->where(array('id'=>$id))->find();
		if(!$info){ //不存在用户，或用户被禁用
			return '';
		}
		$list[$id] = $info;
		S('sys_auth_department', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 获取客服系统中的客户
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getDepartmentName($id){
	return getDepartmentInfo($id, 'department_name');
}



/**
 * 获取组信息
 * @param  integer $id    组id
 * @param  string  $field 组名称
 * @return string         组信息
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getTeamInfo($id, $field = null){
    static $list;
    /* 非法分类ID */
    if(empty($id) || !is_numeric($id)){
        return '';
    }
    if(is_null($list)){
    	$list = S('sys_auth_team_info');
    }
    /* 读取缓存数据 */
    if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
    	$info = M('auth_team')->field($field)->where(array('team_id'=>$id))->find();
    	if(!$info){ //不存在用户，或用户被禁用
    		return '';
    	}
    	$list[$id] = $info;
    	S('sys_auth_team_info', $list,3600); //更新缓存
    }
    return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 获取客服系统中的客户
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getTeamName($id){
    return getTeamInfo($id, 'team_name');
}




/**
 * 获取快递公司信息
 * @param  integer $id    快递公司id
 * @param  string  $field 快递公司名称
 * @author fang
 */
function getMailInfo($id, $field = null){
    static $list;
    /* 非法分类ID */
    if(empty($id) || !is_numeric($id)){
        return '';
    }
    /* 读取缓存数据 */
    $list = S('service_express');
    if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
        $info = M('service_express')->field($field)->where(array('express_id'=>$id))->find();
        if(!$info){ //不存在用户，或用户被禁用
            return '';
        }
        $list[$id] = $info;
        S('service_express', $list,3600); //更新缓存
    }
    return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 获取快递公司信息
 * @author fang
 */
function getMailName($id){
    return getMailInfo($id, 'express_name');
}



/**
 * 获取名单类别
 * @param  integer $id    名单类别id
 * @param  string  $field 类别名称
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getRosterCategoryInfo($id, $field = null){
	static $list;
	/* 非法分类ID */
	if(empty($id) || !is_numeric($id)){
		return '';
	}
	/* 读取缓存数据 */
	$list = S('service_roster_category');
	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
		$info = M('service_roster_category')->field($field)->where(array('roster_category_id'=>$id))->find();
		if(!$info){ //不存在用户，或用户被禁用
			return '';
		}
		$list[$id] = $info;
		S('service_roster_category', $list,3600); //更新缓存
	}
	return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 获取名单类别
 * @author PHP@妖孽	<dino_ma@163.com>
 */
function getRosterCategoryName($id){
	return getRosterCategoryInfo($id, 'roster_category_name');
}



/**
 * 获取名单信息
 * @param  integer $id    快递公司id
 * @param  string  $field 快递公司名称
 * @author fang
 */
function getRollInfo($id, $field = null){
    static $list;
    /* 非法分类ID */
    if(empty($id) || !is_numeric($id)){
        return '';
    }
    /* 读取缓存数据 */
    $list = S('service_roll_call');
    if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
        $info = M('service_roll_call')->field($field)->where(array('roll_call_id'=>$id))->find();
        if(!$info){ //不存在用户，或用户被禁用
            return '';
        }
        $list[$id] = $info;
        S('service_roll_call', $list,3600); //更新缓存
    }
    return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 获取名单名称
 * @author fang
 */
function getRollName($id){
    return getRollInfo($id, 'roll_call_name');
}


/**
 * 获取出发时间
 * @param  integer $id    出发时间id
 * @param  string  $field 出发时间
 * @author fang
 */
function getDepartureInfo($id, $field = null){
    static $list;
    /* 非法分类ID */
    if(empty($id) || !is_numeric($id)){
        return '';
    }
    /* 读取缓存数据 */
    $list = S('service_fang_activity_departure_time');
    if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
        $info = M('service_activity_departure_time')->field($field)->where(array('departure_time_id'=>$id))->find();
        if(!$info){ //不存在用户，或用户被禁用
            return '';
        }
        $list[$id] = $info;
        S('service_fang_activity_departure_time', $list,3600); //更新缓存
    }
    return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 获取出发时间
 * @author fang
 */
function getDepartureName($id){
    return getDepartureInfo($id, 'departure_time');
}


/**
 * @todo    获取浏览器信息
 */
function getBrowser(){
    $agent = $_SERVER["HTTP_USER_AGENT"];
    if(strpos($agent,'MSIE')!==false || strpos($agent,'rv:11.0')) //ie11判断
        return "ie";
    else if(strpos($agent,'Firefox') !== false)
        return "firefox";
    else if(strpos($agent,'Chrome') !== false)
        return "chrome";
    else if(strpos($agent,'Opera') !== false)
        return 'opera';
    else if((strpos($agent,'Chrome') == false) && strpos($agent,'Safari') !== false)
        return 'safari';
    else if(strpos($agent,'360SE') !== false)
        return '360';
    else 
        return 'unknown';
}


/**
 * @todo 获取活动发送短信内容(cache)
 * @param int id 活动id
 * @author PHP@妖孽 <dino_ma@163.com>
 */
 function getActivitySms($id){
 	static $list;
 	/* 非法分类ID */
 	if(empty($id) || !is_numeric($id)){
 		return '';
 	}
 	/* 读取缓存数据 */
 	$list = S('common_get_activity_sms_content');
 	if(empty($list[$id])){
 		$info = M('Activity')->where(array('activity_id'=>$id))->getField('sms_content');
 		if(!$info){ 
 			return '';
 		}
 		$list[$id] = $info;
 		S('common_get_activity_sms_content', $list,3600); //更新缓存
 	}
 	return $list[$id];
 }
 
 
 
 /**
  * 检查$pos(推荐位的值)是否包含指定推荐位$contain
  * @param number $pos 推荐位的值
  * @param number $contain 指定推荐位
  * @return boolean true 包含 ， false 不包含
  * @author PHP@妖孽 <dino_ma@163.com>
  */
 function checkShopPosition($pos = 0, $contain = 0){
     if(empty($pos) || empty($contain)){
         return false;
     }
     //将两个参数进行按位与运算，不为0则表示$contain属于$pos
     $res = $pos & $contain;
     if($res !== 0){
         return true;
     }else{
         return false;
     }
 }

 /**
  * 获取标签信息
  * @param  integer $id    分类ID
  * @param  string  $field 要获取的字段名
  * @return	array	$list  标签缓存数组
  * @author fang
  */
 function getGoodsTagsInfo($id, $field = null){
 	static $list;
 	/* 非法分类ID */
 	if(empty($id) || !is_numeric($id)){
 		return '';
 	}
 	/* 读取缓存数据 */
 	$list = S('sys_goods_tags_list');
 	if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
 		$info = M('shop_tags')->field($field)->where(array('tags_id'=>$id,'status'=>1))->find();
 		if(!$info){ //不存在用户，或用户被禁用
 			return '';
 		}
 		$list[$id] = $info;
 		S('sys_goods_tags_list', $list,3600); //更新缓存
 	}
 	return is_null($field) ? $list[$id] : $list[$id][$field];
 }
 
 /**
  * 获取标签名称
  * @param  integer $id    标签id
  * @return string         标签名称
  * @author fang
  */
 function getGoodsTagsName($id){
 	return getGoodsTagsInfo($id,'tags_name');
 }
 
 /**
  * @todo   获取商品信息
  * @author fang
  */
 function getGoodsInfo($id, $field = null){
     static $list;
     /* 非法分类ID */
     if(empty($id) || !is_numeric($id)){
         return '';
     }
     /* 读取缓存数据 */
     $list = S('sys_goods');
     if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
         $info = M('shop_goods')->field($field)->where(array('goods_id'=>$id))->find();
         if(!$info){ //不存在商品
             return '';
         }
         $list[$id] = $info;
         S('sys_goods', $list,3600); //更新缓存
     }
     return is_null($field) ? $list[$id] : $list[$id][$field];
 }
 
 /**
  * 获取商品名称
  * @param  integer $id    商品id
  * @return string         商品名称
  * @author fang
  */
 function getGoodsName($id){
     return getGoodsInfo($id,'goods_name');
 }
 
 
 /**
  * 获取促销信息
  * @param  integer/array $id    商品ID
  * @param  string  $field 要获取的字段名
  * @return	array	$list  标签缓存数组
  * @author fang
  */
 function getGoodsPromotionList($ids){
 	/* 非法分类ID */
 	if(empty($ids)){
 		return array();
 	}
 	/* 读取缓存数据 */
 	$cache = S('sys_goods_promotion_list');
 	$id_array = array();
 	$field = 'promotion_id,goods_id,promotion_price,promotion_stock,promotion_start_time,promotion_end_time,pic_id as promotion_pic_id';
 	if(is_numeric($ids)){
 		//单商品促销缓存获取
 		if(!isset($cache[$ids])){
 			//获取单条促销数据
 			$where['goods_id'] = $ids;
 			$info = M('shop_goods_promotion')->field($field)->where($where)->find();
 			if(!$info){ 
 				return array();
 			}
 			$cache[$ids] = $info;
 			//更新缓存
 			S('sys_goods_promotion_stock_'.$ids, (int)$info['promotion_stock'], 3600);
 			S('sys_goods_promotion_list', $cache, 3600); 
 		}
 		return $cache[$ids];
 	}else{
 		//多商品促销缓存获取
 		$list = array();
 		foreach ($ids as $key=>$val){
 			if(!isset($cache[$val])){
 				if(!in_array($val, $id_array)){
 					$id_array[] = $val;
 				}
 			}else{
 				$list[$val] = $cache[$val];
 			}
 		}
 		//获取多条促销数据
 		if(count($id_array) > 0){
 			$where['goods_id'] = array('in', $id_array);
 			$info = M('shop_goods_promotion')->field($field)->where($where)->select();
 			if($info){
 				foreach ($info as $key=>$val){
 					$cache[$val['goods_id']] = $val;
 					$list[$val['goods_id']] = $val;
 					//商品库存数量缓存
 					S('sys_goods_promotion_stock_'.$val['goods_id'], (int)$val['promotion_stock'], 3600);
 				}
 			}else{
 				foreach($id_array as $key=>$val){
 					$cache[$val] = $list[$val] = array();
 				}
 			}
 			S('sys_goods_promotion_list', $cache, 3600); //更新缓存
 		}
 		return $list;
 	}
 }
 

 /**
  * 获取商品库存缓存
  * @param  integer $id    商品ID
  * @return	array	$list  商品促销库存
  * @author fang
  */
 function getGoodsPromotionStock($id){
 	/* 非法分类ID */
 	$id = (int)$id;
 	$data = '-1';
 	if($id == 0){
 		return $data;
 	}
 	/* 读取缓存数据 */
 	$stock = S('sys_goods_promotion_stock_'.$id);
 	if($stock == null){
 		$info = M('shop_goods_promotion')->where(array('goods_id'=>$id))->setField('promotion_stock');
 		if($info != null){
 			S('sys_goods_promotion_stock_'.$id, (int)$info, 3600);
 			$data = $info;
 		}
 	}
 	return $data;
 }

 /**
  * @todo    自定义模版导出
  * @param   array   $cell   配置数组［0:名称（必填）;1:宽度（选填）］
  *          $cell = array(
                'A' => array('姓名'),
                'B' => array('手机号',10),
                'C' => array('年龄',10),
             );
  * @param   array   $data   数据数组
  *          $data = array(array('a'=>1,'b'=>2,'c'=>3),array('a'=>11,'b'=>22,'c'=>33));
  * @param   string  $title  excel栏目标题
  * @param   string  $name   excel文件名称
  * @param   string  $list  保存目录
  * @param   string  $suffix 后缀
  * @return  bool    success:file_name   error:false;
  * @since   2015-01-21
  * @author  fang
  */
 function dataToExcel($cell, $data, $title, $name, $list = 'Data/', $suffix = '.xlsx'){
     // 引用
     import( "Common.Msj.PHPExcel.PHPExcel" ,'' ,'.php' );
     // 初始化
     $excel_obj = new \PHPExcel();
     // 设置sheet
     $excel_obj_sheet = $excel_obj->setActiveSheetIndex(0);
     $excel_obj_sheet->setTitle($title);
     $i = 1;
     // 表头列宽设置
     foreach ($cell as $key=>$val){
         // 列宽度设置('B', '20')
         if(isset($val[1]) && $val[1] > 0){
             $excel_obj_sheet->getColumnDimension($key)->setWidth($val[1]);
         }
         $excel_obj_sheet->setCellValue($key.$i, $val[0]); // 表头名称('A1', '订单号')
     }
     ++$i;
     // 填充信息
     foreach ($data as $value){
         $j = 'A';
         foreach ($value as $v){
             $excel_obj_sheet->setCellValue($j.$i, $v); // 行数据('A1', 'XXX')
             ++$j;
         }
         ++$i;
     }
     // 清楚缓存
     ob_end_clean();
     // 结果处理
     $file_name = $list.$name.'-'.NOW_TIME.$suffix;
     $excel_obj_writer = new \PHPExcel_Writer_Excel2007($excel_obj);
     $excel_obj_writer->save($file_name);
     // 返回
     return (file_exists($file_name))? $file_name : false ;
 }
 
 /**
  * @todo   redis   锁＋事务 自增处理
  * @param  string  key     缓存元素
  * @param  int     total   总数  
  * @return bool    success:当前数   error:false
  */
 function redisWatch($key, $total = 1){
     $redis = Think\Cache::getInstance('Redis');
     $count = $redis->get($key);
     if($total > $count){
         return false;
     }
     $redis->watch($key);
     $ret = $redis->multi()->incr($key)->exec();
     return ($ret)? $ret : false;
 }
 
 /**
  * @todo 礼品清单
  * @param unknown $type
  * @return boolean|string
  * @author sap
  * @since 2016-1-26
  */
 function getPresentTitle($present_id,$activity_id){
     if(empty($present_id) || empty($activity_id)){
         return false;
     }
     $present_id_array = C('PRESENT_ID');
     if(isset($present_id_array[$activity_id][$present_id])){
         return $present_id_array[$activity_id][$present_id];
     }else{
         return '-';
     }
 }
 
 /**
  * @todo 获取线上家博会品类信息并缓存
  * @param  integer $id    分类ID
  * @param  string  $field 要获取的字段名
  * @return string         分类信息
  * @author sap
  */
 function getOnlineCategoryInfo($id, $field = null){
     static $list;
     /* 非法分类ID */
     if(empty($id) || !is_numeric($id)){
         return '';
     }
     /* 读取缓存数据 */
     $list = S('sys_online_category_');
     if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
         $info = M('online_category')->field($field)->where(array('category_id'=>$id))->find();
         if(!$info){ //不存在用户，或用户被禁用
             return '';
         }
         $list[$id] = $info;
         S('sys_online_category_', $list,3600); //更新缓存
     }
     return is_null($field) ? $list[$id] : $list[$id][$field];
 }
 
 /**
  * @todo 获取线上家博会品类信息并缓存
  * @author sap
  */
 function getOnlineCategoryName($id){
     return getOnlineCategoryInfo($id, 'category_name');
 }
 
/**
* @todo 获取线上家博会展馆信息并缓存
* @param  integer $id    分类ID
* @param  string  $field 要获取的字段名
* @return string         分类信息
* @author sap
*/
function getOnlineZoneInfo($id, $field = null){
    static $list;
    /* 非法分类ID */
    if(empty($id) || !is_numeric($id)){
     return '';
    } 
    /* 读取缓存数据 */
    $list = S('sys_online_zone_');
    if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
        $info = M('online_zone')->field($field)->where(array('zone_id'=>$id))->find();
        if(!$info){ //不存在用户，或用户被禁用
            return '';
        }
        $list[$id] = $info;
        S('sys_online_zone_', $list,3600); //更新缓存
    }
    return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
* @todo 获取线上家博会信息展馆并缓存
* @author sap
*/
function getOnlineZoneName($id){
    return getOnlineZoneInfo($id, 'zone_name');
}

/**
 * @todo 获取线上家博会店铺信息并缓存
 * @param  integer $id    ID店铺
 * @param  string  $field 要获取的字段名
 * @return string         店铺信息
 * @author sap
 */
function getOnlineShopInfo($id, $field = null){
    static $list;
    /* 非法分类ID */
    if(empty($id) || !is_numeric($id)){
        return '';
    }
    /* 读取缓存数据 */
    $list = S('sys_online_shop_');
    if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
        $info = M('online_shop')->field($field)->where(array('online_shop_id'=>$id))->find();
        if(!$info){ //不存在用户，或用户被禁用
            return '';
        }
        $list[$id] = $info;
        S('sys_online_shop_', $list,3600); //更新缓存
    }
    return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * @todo 获取线上家博会信息展馆并缓存
 * @author sap
 */
function getOnlineShopName($id){
    return getOnlineShopInfo($id, 'online_shop_name');
}

/**
 * @todo 过滤html标签
 * @param string $str
 * @return string
 */
function clearHtml($str)
{
    $str = strip_tags($str);
    $str = trim($str);
    $str = preg_replace('/\s(?=\s)/', '', $str);
    $str = preg_replace('/[\n\r\t]/', ' ', $str);
    $str = str_replace('&nbsp;', '', $str);
    return $str;
}
/**
 * 取汉字的第一个字的首字母
 * @param type $str
 * @return string|null
 * @author fzh
 */
function getFirstCharter($str){
    if(empty($str)){return null;}
    $fchar=ord($str{0});
    if($fchar>=ord('A')&&$fchar<=ord('z')) return strtoupper($str{0});
    $s1=iconv('UTF-8','gb2312',$str);
    $s2=iconv('gb2312','UTF-8',$s1);
    $s=$s2==$str?$s1:$str;
    $asc=ord($s{0})*256+ord($s{1})-65536;
    if($asc>=-20319&&$asc<=-20284) return 'A';
    if($asc>=-20283&&$asc<=-19776) return 'B';
    if($asc>=-19775&&$asc<=-19219) return 'C';
    if($asc>=-19218&&$asc<=-18711) return 'D';
    if($asc>=-18710&&$asc<=-18527) return 'E';
    if($asc>=-18526&&$asc<=-18240) return 'F';
    if($asc>=-18239&&$asc<=-17923) return 'G';
    if($asc>=-17922&&$asc<=-17418) return 'H';
    if($asc>=-17417&&$asc<=-16475) return 'J';
    if($asc>=-16474&&$asc<=-16213) return 'K';
    if($asc>=-16212&&$asc<=-15641) return 'L';
    if($asc>=-15640&&$asc<=-15166) return 'M';
    if($asc>=-15165&&$asc<=-14923) return 'N';
    if($asc>=-14922&&$asc<=-14915) return 'O';
    if($asc>=-14914&&$asc<=-14631) return 'P';
    if($asc>=-14630&&$asc<=-14150) return 'Q';
    if($asc>=-14149&&$asc<=-14091) return 'R';
    if($asc>=-14090&&$asc<=-13319) return 'S';
    if($asc>=-13318&&$asc<=-12839) return 'T';
    if($asc>=-12838&&$asc<=-12557) return 'W';
    if($asc>=-12556&&$asc<=-11848) return 'X';
    if($asc>=-11847&&$asc<=-11056) return 'Y';
    if($asc>=-11055&&$asc<=-10247) return 'Z';
    return null;
}

/**
 * 把返回的数据集转换成Tree
 * @access public
 * @param array $list 要转换的数据集
 * @param string $pid parent标记字段
 * @param string $level level标记字段
 * @return array
 */
function toTree($list=null, $pk='id',$pid = 'pid',$child = '_child'){
    if(null === $list) {
        // 默认直接取查询返回的结果集合
        $list   =   &$this->dataList;
    }
    // 创建Tree
    $tree = array();
    if(is_array($list)) {
        // 创建基于主键的数组引用
        $refer = array();

        foreach ($list as $key => $data) {
            $_key = is_object($data)?$data->$pk:$data[$pk];
            $refer[$_key] =& $list[$key];
        }
        foreach ($list as $key => $data) {
            // 判断是否存在parent
            $parentId = is_object($data)?$data->$pid:$data[$pid];
            $is_exist_pid = false;
            foreach($refer as $k=>$v){
                if($parentId==$k){
                    $is_exist_pid = true;
                    break;
                }
            }
            if ($is_exist_pid) {
                if (isset($refer[$parentId])) {
                    $parent =& $refer[$parentId];
                    $parent[$child][] =& $list[$key];
                }
            } else {
                $tree[$key] =& $list[$key];
            }
        }
    }
    return $tree;
}

/**
 * 获取配置的值
 * @param string $key 
 * @return boolean
 * @author fzh
 */
function getC($key){
    /* 读取数据库中的配置 */
    $config =   S('DB_CONFIG_DATA');
    if(!$config){
        $config =   api('Config/lists');
        S('DB_CONFIG_DATA',$config);
    }
    return isset($config[$key]) ? $config[$key] : false;
}

/**
 * 获取招商会品类信息并缓存
 * @param  integer $id    分类ID
 * @param  string  $field 要获取的字段名
 * @return string         分类信息
 * @author fzh
 */
function getBusinessCategoryInfo($id, $field = null){
    static $list;
    /* 非法分类ID */
    if(empty($id) || !is_numeric($id)){
        return '';
    }
    /* 读取缓存数据 */
    $list = S('sys_business_category_');
    if((empty($list[$id]) && is_null($field))||(empty($list[$id][$field]))){
        $info = M('business_category')->field($field)->where(array('business_category_id'=>$id))->find();
        if(!$info){ //不存在用户，或用户被禁用
            return '';
        }
        $list[$id] = $info;
        S('sys_business_category_', $list,3600); //更新缓存
    }
    return is_null($field) ? $list[$id] : $list[$id][$field];
}

/**
 * 获取招商会分类信息并缓存
 * @author fzh
 */
function getBusinessCategoryName($id){
    return getBusinessCategoryInfo($id, 'business_category_name');
}